home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 001-025 / 002 / make / osdate.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  6KB  |  243 lines

  1. /*
  2. ; OSDATE - return file's creation-date (called from Lattice), or -1
  3. ;       if can't find the file.
  4. ; Synopsis:
  5. ;        int osdate(filename, time1, time2)
  6. ;            char *filename;
  7. ;            int *time1, *time2;
  8. ;
  9. */
  10.  
  11. #include "lar.h"
  12. #define FILERR (-1)
  13. #include "make.h"
  14.  
  15. static void getftime ();
  16. extern char *printdate ();
  17.  
  18. DATE osdate (filename, success)
  19. char *filename;
  20. int *success;
  21. {
  22.     extern DATE adate ();
  23.     auto DATE newdate;
  24. #ifndef AMIGA
  25.     register int handle;
  26. #endif
  27.  
  28.     DBUG_ENTER ("osdate");
  29. #ifdef AMIGA
  30.     newdate = adate ();
  31.     getftime (filename, newdate, success);
  32. #else
  33.     if ((handle = _open (filename, O_RDONLY)) == FILERR) {
  34.     *success = FAILURE;
  35.     newdate = (DATE) NULL;
  36.     } else {
  37.     newdate = adate ();
  38.     getftime (handle, newdate);
  39.     _close (handle);
  40.     *success = SUCCEED;
  41.     }
  42. #endif
  43.     DBUG_RETURN (newdate);
  44. }
  45.  
  46. struct ludir ldir[MAXFILES];
  47. int nslots;
  48. extern char *getname ();
  49.  
  50. DATE getarchdate (archname, filename)
  51. char *archname;
  52. char *filename;
  53. {
  54.     register fildesc lfd;
  55.     register int i;
  56.     register struct ludir *lptr;
  57.     union timing {
  58.     DATE ftimeptr;
  59.     long *longptr;
  60.     } unionptr;
  61.     extern DATE adate ();
  62.     auto DATE newdate;
  63.     register char *realname;
  64.     extern void cant ();
  65.  
  66.     DBUG_ENTER ("getarchdate");
  67.     DBUG_4 ("ard", "looking for %s inside %s", filename, archname);
  68.     if ((lfd = _open (archname, O_RDONLY)) == FILERR) {
  69.     cant (archname);
  70.     }
  71.     getdir (lfd);
  72.     for (i = 1, lptr = ldir + 1; i < nslots; i++, lptr++) {
  73.     if (lptr -> l_stat != ACTIVE) {
  74.         continue;
  75.     }
  76.     realname = getname ((char *) lptr -> l_name, (char *) lptr -> l_ext);
  77.     if (strcmp (realname, filename) != 0) {
  78.         continue;
  79.     }
  80.     DBUG_3 ("ard", "found name %s", realname);
  81.     DBUG_3 ("ard", "time %lx", lwtol (lptr -> l_datetime));
  82.     newdate = adate ();
  83.     unionptr.ftimeptr = newdate;
  84.     *(unionptr.longptr) = lwtol (lptr -> l_datetime);
  85.     break;
  86.     }
  87.     (void) _close (lfd);
  88.     DBUG_3 ("ard", "date is %s", printdate (newdate));
  89.     DBUG_RETURN (newdate);
  90. }
  91.  
  92. #ifdef LAR
  93. copyfile (archname, filename)
  94. char *archname;
  95. char *filename;
  96. {
  97.     register int i;
  98.     register struct ludir *lptr;
  99.     register fildesc lfd;
  100.     register fildesc ofd;
  101.     union timer timeunion;
  102.     extern int errno;
  103.     register char *realname;
  104.     auto char outname[64];
  105.     register char *tmpptr;
  106.     extern char *strrchr ();
  107.     extern void cant ();
  108.  
  109.     DBUG_ENTER ("copyfile");
  110.     DBUG_4 ("cpf", "looking for %s inside %s", filename, archname);
  111.     if ((lfd = _open (archname, O_RDWR)) == FILERR) {
  112.     cant (archname);
  113.     }
  114.     getdir (lfd);
  115.     for (i = 1, lptr = &ldir[1]; i < nslots; i++, lptr++) {
  116.     if (lptr -> l_stat != ACTIVE) {
  117.         continue;
  118.     }
  119.     realname = getname (lptr -> l_name, lptr -> l_ext);
  120.     if (strcmp (realname, filename) != 0) {
  121.         continue;
  122.     }
  123.     /* generate real filename */
  124.     tmpptr = strrchr (archname, '/');    /* should be path chr */
  125.     if (tmpptr != NULL) {
  126.         i = (int) (tmpptr - archname);
  127.         i++;
  128.         DBUG_3 ("tmpptr", "tmpptr was not NULL; i is %d", i);
  129.         strncpy (outname, archname, i);
  130.     } else {
  131.         DBUG_2 ("tmpptr", "tmpptr was NULL");
  132.         i = 0;
  133.         *outname = '\0';
  134.     }
  135.     strcat (outname, realname);
  136.     DBUG_3 ("outn", "got it; about to extract %s", outname);
  137.     ofd = _creat (outname, 0);
  138.     if (ofd == FILERR) {
  139.         fputs (outname, stderr);
  140.         fputs ("  - can't create\n", stderr);
  141.         DBUG_VOID_RETURN;
  142.     } else {
  143.         (void) lseek (lfd, (long) lwtol (lptr -> l_off), 0);
  144.         acopy (lfd, ofd, lwtol (lptr -> l_len));
  145.         timeunion.realtime = lwtol (lptr -> l_datetime);
  146.         if (ofd != fileno (stdout)) {
  147.         (void) setftime (ofd, &(timeunion.ftimep));
  148.         (void) _close (ofd);
  149.         }
  150.         break;        /* exit after copy */
  151.     }
  152.     }
  153.     (void) _close (lfd);
  154.     DBUG_VOID_RETURN;
  155. }
  156.  
  157. static void acopy (fdi, fdo, nbytes)    /* copy nbytes from fdi to fdo */
  158. fildesc fdi;
  159. fildesc fdo;
  160. long nbytes;
  161. {
  162.     register int btr;
  163.     register int retval;
  164.     char blockbuf[BLOCK];
  165.  
  166.     for (btr = (nbytes > BLOCK) ? BLOCK : (int) nbytes; btr > 0;
  167.         nbytes -= BLOCK, btr = (nbytes > BLOCK) ? BLOCK : (int) nbytes) {
  168.     if ((retval = _read (fdi, blockbuf, btr)) != btr) {
  169.         if (retval == 0) {
  170.         error ("Premature EOF\n");
  171.         }
  172.         if (retval == FILERR) {
  173.         error ("Can't read");
  174.         }
  175.     }
  176.     if ((retval = _write (fdo, blockbuf, btr)) != btr) {
  177.         if (retval == FILERR) {
  178.         error ("Write Error");
  179.         }
  180.     }
  181.     }
  182. }
  183. #endif                /* LAR */
  184.  
  185. #ifdef unix
  186. #include <sys/types.h>
  187. #include <sys/stat.h>
  188.  
  189. static void getftime (handle, date)
  190. int handle;
  191. DATE date;
  192. {
  193.     struct stat statb;
  194.  
  195.     DBUG_ENTER ("getftime");
  196.     fstat (handle, &statb);
  197.     *date = statb.st_mtime;
  198.     DBUG_3 ("date", "got date %lu", *date);
  199.     DBUG_VOID_RETURN;
  200. }
  201. #endif
  202.  
  203. #ifdef AMIGA
  204. #include <libraries/dosextens.h>
  205. #include <libraries/dos.h>
  206.  
  207. static void getftime (filename, date, success)
  208. char *filename;
  209. DATE date;
  210. int *success;
  211. {
  212.     struct FileInfoBlock *fib;
  213.     struct FileLock *lockp;    
  214.     int status = FAILURE;
  215.     extern struct FileLock *Lock ();
  216.  
  217.     DBUG_ENTER ("getftime");
  218.     lockp = Lock (filename, ACCESS_READ);
  219.     if (lockp != NULL) {
  220.     fib = (struct FileInfoBlock *) Calloc (1, sizeof (struct FileInfoBlock));
  221.     DBUG_3 ("fib", "fib = %x", fib);
  222.     if (fib == NULL) {
  223.         allerr ();
  224.     } else {
  225.         if (Examine (lockp, fib)) {
  226.         DBUG_3 ("date", "file '%s'", filename);
  227.         DBUG_3 ("date", "date is %s", printdate (&(fib -> fib_Date)));
  228.         date -> ds_Days = fib -> fib_Date.ds_Days;
  229.         date -> ds_Minute = fib -> fib_Date.ds_Minute;
  230.         date -> ds_Tick = fib -> fib_Date.ds_Tick;
  231.         status = SUCCEED;
  232.         } else {
  233.         fprintf (stderr, "Examine() failed!\n");
  234.         }
  235.         free (fib);
  236.         UnLock (lockp);
  237.     }
  238.     }
  239.     *success = status;
  240.     DBUG_VOID_RETURN;
  241. }
  242. #endif
  243.